我需要做一件非常简单的事情 - 找出是否显示了软件键盘。这在Android中可能吗?
新答案 添加于 2012 年 1 月 25 日
自从写了下面的答案后,有人告诉我ViewTreeObserver和朋友的存在,这些 API 自版本 1 以来一直潜伏在 SDK 中。
不需要自定义布局类型,一个更简单的解决方案是为您的活动的根视图提供一个已知的 ID,例如@+id/activityRoot,将 GlobalLayoutListener 挂钩到 ViewTreeObserver,并从那里计算您的活动的视图根和窗口大小之间的大小差异:
@+id/activityRoot
final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > dpToPx(this, 200)) { // if more than 200 dp, it's probably a keyboard... // ... do something here } } });
使用实用程序,例如:
public static float dpToPx(Context context, float valueInDp) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics); }
简单!
注意: 您的应用程序必须在 Android Manifest 中设置此标志,android:windowSoftInputMode="adjustResize"否则上述解决方案将不起作用。
android:windowSoftInputMode="adjustResize"
原始答案
是的,这是可能的,但它比它应该做的要难得多。
如果我需要关心键盘何时出现和消失(这很常见),那么我所做的就是将我的顶级布局类自定义为一个覆盖onMeasure(). 基本逻辑是,如果布局发现自己填充的空间明显小于窗口的总面积,那么可能会显示软键盘。
onMeasure()
import android.app.Activity; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.LinearLayout; /* * LinearLayoutThatDetectsSoftKeyboard - a variant of LinearLayout that can detect when * the soft keyboard is shown and hidden (something Android can't tell you, weirdly). */ public class LinearLayoutThatDetectsSoftKeyboard extends LinearLayout { public LinearLayoutThatDetectsSoftKeyboard(Context context, AttributeSet attrs) { super(context, attrs); } public interface Listener { public void onSoftKeyboardShown(boolean isShowing); } private Listener listener; public void setListener(Listener listener) { this.listener = listener; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int height = MeasureSpec.getSize(heightMeasureSpec); Activity activity = (Activity)getContext(); Rect rect = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rect.top; int screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight(); int diff = (screenHeight - statusBarHeight) - height; if (listener != null) { listener.onSoftKeyboardShown(diff>128); // assume all soft keyboards are at least 128 pixels high } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
然后在您的活动课程中…
public class MyActivity extends Activity implements LinearLayoutThatDetectsSoftKeyboard.Listener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... LinearLayoutThatDetectsSoftKeyboard mainLayout = (LinearLayoutThatDetectsSoftKeyboard)findViewById(R.id.main); mainLayout.setListener(this); ... } @Override public void onSoftKeyboardShown(boolean isShowing) { // do whatever you need to do here } ... }